home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / scsi / scsi_transport_spi.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.9 KB  |  158 lines

  1. /* 
  2.  *  Parallel SCSI (SPI) transport specific attributes exported to sysfs.
  3.  *
  4.  *  Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20. #ifndef SCSI_TRANSPORT_SPI_H
  21. #define SCSI_TRANSPORT_SPI_H
  22.  
  23. #include <linux/transport_class.h>
  24. #include <linux/mutex.h>
  25.  
  26. struct scsi_transport_template;
  27. struct scsi_target;
  28. struct scsi_device;
  29. struct Scsi_Host;
  30.  
  31. struct spi_transport_attrs {
  32.     int period;        /* value in the PPR/SDTR command */
  33.     int min_period;
  34.     int offset;
  35.     int max_offset;
  36.     unsigned int width:1;    /* 0 - narrow, 1 - wide */
  37.     unsigned int max_width:1;
  38.     unsigned int iu:1;    /* Information Units enabled */
  39.     unsigned int dt:1;    /* DT clocking enabled */
  40.     unsigned int qas:1;    /* Quick Arbitration and Selection enabled */
  41.     unsigned int wr_flow:1;    /* Write Flow control enabled */
  42.     unsigned int rd_strm:1;    /* Read streaming enabled */
  43.     unsigned int rti:1;    /* Retain Training Information */
  44.     unsigned int pcomp_en:1;/* Precompensation enabled */
  45.     unsigned int hold_mcs:1;/* Hold Margin Control Settings */
  46.     unsigned int initial_dv:1; /* DV done to this target yet  */
  47.     unsigned long flags;    /* flags field for drivers to use */
  48.     /* Device Properties fields */
  49.     unsigned int support_sync:1; /* synchronous support */
  50.     unsigned int support_wide:1; /* wide support */
  51.     unsigned int support_dt:1; /* allows DT phases */
  52.     unsigned int support_dt_only; /* disallows ST phases */
  53.     unsigned int support_ius; /* support Information Units */
  54.     unsigned int support_qas; /* supports quick arbitration and selection */
  55.     /* Private Fields */
  56.     unsigned int dv_pending:1; /* Internal flag: DV Requested */
  57.     unsigned int dv_in_progress:1;    /* Internal: DV started */
  58.     struct mutex dv_mutex; /* semaphore to serialise dv */
  59. };
  60.  
  61. enum spi_signal_type {
  62.     SPI_SIGNAL_UNKNOWN = 1,
  63.     SPI_SIGNAL_SE,
  64.     SPI_SIGNAL_LVD,
  65.     SPI_SIGNAL_HVD,
  66. };
  67.  
  68. struct spi_host_attrs {
  69.     enum spi_signal_type signalling;
  70. };
  71.  
  72. /* accessor functions */
  73. #define spi_period(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->period)
  74. #define spi_min_period(x) (((struct spi_transport_attrs *)&(x)->starget_data)->min_period)
  75. #define spi_offset(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->offset)
  76. #define spi_max_offset(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_offset)
  77. #define spi_width(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->width)
  78. #define spi_max_width(x) (((struct spi_transport_attrs *)&(x)->starget_data)->max_width)
  79. #define spi_iu(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->iu)
  80. #define spi_dt(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->dt)
  81. #define spi_qas(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->qas)
  82. #define spi_wr_flow(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->wr_flow)
  83. #define spi_rd_strm(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->rd_strm)
  84. #define spi_rti(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->rti)
  85. #define spi_pcomp_en(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->pcomp_en)
  86. #define spi_hold_mcs(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->hold_mcs)
  87. #define spi_initial_dv(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->initial_dv)
  88. #define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending)
  89.  
  90. #define spi_support_sync(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_sync)
  91. #define spi_support_wide(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_wide)
  92. #define spi_support_dt(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_dt)
  93. #define spi_support_dt_only(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_dt_only)
  94. #define spi_support_ius(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_ius)
  95. #define spi_support_qas(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_qas)
  96.  
  97. #define spi_flags(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->flags)
  98. #define spi_signalling(h)    (((struct spi_host_attrs *)(h)->shost_data)->signalling)
  99.  
  100.  
  101.  
  102. /* The functions by which the transport class and the driver communicate */
  103. struct spi_function_template {
  104.     void    (*get_period)(struct scsi_target *);
  105.     void    (*set_period)(struct scsi_target *, int);
  106.     void    (*get_offset)(struct scsi_target *);
  107.     void    (*set_offset)(struct scsi_target *, int);
  108.     void    (*get_width)(struct scsi_target *);
  109.     void    (*set_width)(struct scsi_target *, int);
  110.     void    (*get_iu)(struct scsi_target *);
  111.     void    (*set_iu)(struct scsi_target *, int);
  112.     void    (*get_dt)(struct scsi_target *);
  113.     void    (*set_dt)(struct scsi_target *, int);
  114.     void    (*get_qas)(struct scsi_target *);
  115.     void    (*set_qas)(struct scsi_target *, int);
  116.     void    (*get_wr_flow)(struct scsi_target *);
  117.     void    (*set_wr_flow)(struct scsi_target *, int);
  118.     void    (*get_rd_strm)(struct scsi_target *);
  119.     void    (*set_rd_strm)(struct scsi_target *, int);
  120.     void    (*get_rti)(struct scsi_target *);
  121.     void    (*set_rti)(struct scsi_target *, int);
  122.     void    (*get_pcomp_en)(struct scsi_target *);
  123.     void    (*set_pcomp_en)(struct scsi_target *, int);
  124.     void    (*get_hold_mcs)(struct scsi_target *);
  125.     void    (*set_hold_mcs)(struct scsi_target *, int);
  126.     void    (*get_signalling)(struct Scsi_Host *);
  127.     void    (*set_signalling)(struct Scsi_Host *, enum spi_signal_type);
  128.     int    (*deny_binding)(struct scsi_target *);
  129.     /* The driver sets these to tell the transport class it
  130.      * wants the attributes displayed in sysfs.  If the show_ flag
  131.      * is not set, the attribute will be private to the transport
  132.      * class */
  133.     unsigned long    show_period:1;
  134.     unsigned long    show_offset:1;
  135.     unsigned long    show_width:1;
  136.     unsigned long    show_iu:1;
  137.     unsigned long    show_dt:1;
  138.     unsigned long    show_qas:1;
  139.     unsigned long    show_wr_flow:1;
  140.     unsigned long    show_rd_strm:1;
  141.     unsigned long    show_rti:1;
  142.     unsigned long    show_pcomp_en:1;
  143.     unsigned long    show_hold_mcs:1;
  144. };
  145.  
  146. struct scsi_transport_template *spi_attach_transport(struct spi_function_template *);
  147. void spi_release_transport(struct scsi_transport_template *);
  148. void spi_schedule_dv_device(struct scsi_device *);
  149. void spi_dv_device(struct scsi_device *);
  150. void spi_display_xfer_agreement(struct scsi_target *);
  151. int spi_print_msg(const unsigned char *);
  152. int spi_populate_width_msg(unsigned char *msg, int width);
  153. int spi_populate_sync_msg(unsigned char *msg, int period, int offset);
  154. int spi_populate_ppr_msg(unsigned char *msg, int period, int offset, int width,
  155.         int options);
  156.  
  157. #endif /* SCSI_TRANSPORT_SPI_H */
  158.